在Servlet 3.0+的环境中,你可以选择以编码的方式配置Servlet容器或是结合web.xml
文件使用。下面是注册DispatcherServlet
的例子:
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
WebApplicationInitializer
是一个由Spring MVC提供的接口,用来确保你的视线可以被检测且自动用于初始化Servlet 3的容器。这个接口的抽象实现类AbstractDipatcherServletInitializer
可以让注册DispatcherServlet
变得简单,只需要覆盖几个方法指定servlet映射和指定DispatcherServlet
配置。
建议在应用中使用基于Java的Spring配置:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
如果是使用基于XML的配置,你应该直接继承AbstractDispatcherServletInitializer
:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
AbstractDispatcherServletInitializer
也提供便捷的方法来添加Filter
实例并让他们自动映射到DispatcherServlet
:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
每个过滤器都会根据它的具体类型添加一个默认名称,并自动映射到DispatcherServlet
。
AbstractDispatcherServletInitializer
的protected方法isAsyncSupported
提供了一个为DispatcherServlet
和映射它的所有过滤器设置异步支持的地方。这个标志默认被设为true
。
最后,如果你想要更深度的自定义DispathcerServlet
,你可以覆盖createDispathcerServlet
方法。